//package _rabbitmq.aliyun;
//
//import com.alibaba.mq.amqp.utils.UserUtils;
//import com.aliyun.auth.credentials.Credential;
//import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
//import com.aliyun.sdk.service.sts20150401.AsyncClient;
//import com.aliyun.sdk.service.sts20150401.models.AssumeRoleRequest;
//import com.aliyun.sdk.service.sts20150401.models.AssumeRoleResponse;
//import com.rabbitmq.client.impl.CredentialsProvider;
//import darabonba.core.client.ClientOverrideConfiguration;
//import org.apache.commons.lang3.StringUtils;
//
//import java.security.InvalidKeyException;
//import java.security.NoSuchAlgorithmException;
//import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.ExecutionException;
//
//public class AliyunCredentialsProvider implements CredentialsProvider {
//    /**
//     * 默认过期时间，单位毫秒。可以根据业务实际情况设置。
//     */
//    private final long STS_TIMEOUT_DEFAULT = 1800 * 1000;
//    /**
//     * 实例ID，从云消息队列 RabbitMQ 版控制台获取。
//     */
//    private final String instanceId;
//    /**
//     * Access Key ID。
//     */
//    private String accessKeyId;
//    /**
//     * Access Key Secret。
//     */
//    private String accessKeySecret;
//    /**
//     *  (可选)security temp token。
//     */
//    private String securityToken;
//    /**
//     * STS过期时间, 记录后可提前更新STS token。
//     */
//    private Long timeStampLimit;
//
//    // 阿里云账号AccessKey拥有所有API的访问权限，建议您使用RAM用户进行API访问或日常运维。
//    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里，否则可能导致AccessKey泄露，威胁您账号下所有资源的安全。
//    public AliyunCredentialsProvider(final String instanceId) {
//        this.instanceId = instanceId;
//    }
//    public void updateProperties(String alibabaAccessKeyId, String alibabaAccessKeySecret, String region, String roleARN) throws ExecutionException, InterruptedException {
//        this.timeStampLimit = System.currentTimeMillis() + STS_TIMEOUT_DEFAULT;
//        // 自行调用AssumeRole接口实现，进行身份信息获取。
//        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
//                .accessKeyId(alibabaAccessKeyId)
//                .accessKeySecret(alibabaAccessKeySecret)
//                .build());
//        AsyncClient client = AsyncClient.builder()
//                .region(region) // 请设置Region ID, 例如cn-hangzhou。
//                .credentialsProvider(provider)
//                .overrideConfiguration(
//                        ClientOverrideConfiguration.create()
//                                // Endpoint请参考https://api.aliyun.com/product/Sts。
//                                .setEndpointOverride("sts." + region + ".aliyuncs.com")
//                        //.setConnectTimeout(Duration.ofSeconds(30))
//                )
//                .build();
//        AssumeRoleRequest assumeRoleRequest = AssumeRoleRequest.builder()
//                .roleArn(roleARN) // 从控制台获取得到的角色ARN。
//                .roleSessionName("testRoleName") // 当前角色Session的名称，可自定义。
//                .durationSeconds(STS_TIMEOUT_DEFAULT / 1000)
//                .build();
//        CompletableFuture<AssumeRoleResponse> response = client.assumeRole(assumeRoleRequest);
//        // Synchronously get the return value of the API request
//        AssumeRoleResponse resp = response.get();
//        if (resp.getBody().getCredentials() != null) {
//            System.out.println("[INFO] Update AK, SK, Token successfully.");
//            this.accessKeyId = resp.getBody().getCredentials().getAccessKeyId();
//            this.securityToken = resp.getBody().getCredentials().getSecurityToken();
//            this.accessKeySecret = resp.getBody().getCredentials().getAccessKeySecret();
//        }
//        client.close();
//    }
//
//    // 检测当前该token是否快要过期。
//    public boolean isNearlyExpired() {
//        // 提前30秒判断。
//        return System.currentTimeMillis() > timeStampLimit - 30 * 1000L;
//    }
//
//    @Override
//    public String getUsername() {
//        if(StringUtils.isNotEmpty(securityToken)) {
//            return UserUtils.getUserName(accessKeyId, instanceId, securityToken);
//        } else {
//            return UserUtils.getUserName(accessKeyId, instanceId);
//        }
//    }
//
//    @Override
//    public String getPassword() {
//        try {
//            return UserUtils.getPassord(accessKeySecret);
//        } catch (InvalidKeyException e) {
//            //todo
//        } catch (NoSuchAlgorithmException e) {
//            //todo
//        }
//        return null;
//    }
//}